package com.example.design_pattern.factory;

// 定义汽车接口
interface Car {
    void drive();
}

// 具体的汽车实现类：轿车
class SedanCar implements Car {
    @Override
    public void drive() {
        System.out.println("Driving Sedan car...");
    }
}

// 具体的汽车实现类：SUV
class SuvCar implements Car {
    @Override
    public void drive() {
        System.out.println("Driving SUV car...");
    }
}

// 定义汽车工厂接口
interface CarFactory {
    Car createCar();
}

// 具体的汽车工厂实现类：轿车工厂
class SedanCarFactory implements CarFactory {
    @Override
    public Car createCar() {
        return new SedanCar();
    }
}

// 具体的汽车工厂实现类：SUV工厂
class SuvCarFactory implements CarFactory {
    @Override
    public Car createCar() {
        return new SuvCar();
    }
}

// 客户端代码
public class FactoryTest {
    public static void main(String[] args) {
        // 创建轿车工厂
        CarFactory sedanFactory = new SedanCarFactory();
        // 生产轿车
        Car sedanCar = sedanFactory.createCar();
        // 驾驶轿车
        sedanCar.drive();

        // 创建SUV工厂
        CarFactory suvFactory = new SuvCarFactory();
        // 生产SUV
        Car suvCar = suvFactory.createCar();
        // 驾驶SUV
        suvCar.drive();
    }
}

//备注：
//工厂模式与自己手动的通过new 构造函数的方式创建对象这种方式相比，有什么好处吗
// 工厂模式相比直接通过构造函数创建对象有以下好处：
//1. **封装性**: 工厂模式将对象的创建过程封装在工厂类中，客户端无需了解对象的创建细节，只需通过工厂类来获取所需对象，降低了耦合度。
//2. **灵活性**: 工厂模式可以根据实际需求灵活地决定创建哪种具体对象，而不需要客户端依赖具体的类。
//3. **扩展性**: 当需要新增其他类型的对象时，只需修改工厂类即可，而不需要修改客户端代码。
//4. **解耦**: 工厂模式将客户端与具体对象的创建过程解耦，客户端只需要知道工厂类的接口，不需要了解具体的实现细节。
//5. **便于管理**: 工厂模式集中了对象的创建过程，方便统一管理和维护。
//总的来说，工厂模式可以提高代码的可维护性、灵活性和扩展性，是一种常用的设计模式。

//个人总结：我认为，工厂模式主要就是用于解耦。代码一般来说，拆分的越细、专业化分工越高，就越解耦。
// 想象一下，比如，在代码中，有很多的汽车的实例对象，这些地方全部都new了。
// 然后，突然某一天，我们说要改变一下构造函数的参数个数或者是类型，那么，这些之前new的地方都得换。
// 但是，如果是工厂模式的话，那么，我只用把工厂里面的creat的方法里面new的时候使用构造函数的方式一处改一下就可以了。
// 这就是解耦的好处。